/* model */
import Field from '@model/entity/Field'
import CardInfo, { CardInfoConfig, CardInfoConnectorConfig } from '@model/entity/CardInfo'
import { CardInputTypeEnum } from '@model/enum/CardEnum'
import { 
  AppTypeEnum,
  ConnectorBizTypeEnum, 
  ConnectorOptionsActionEnum, 
  ConnectorOptionsFieldOptionValueTypeEnum, 
  TriggerSettingNodeTypeEnum
} from '@src/modules/connector/model/enum'
/* types */
import { ConnectorRuleFormItemType } from '@src/modules/connector/types'


type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;


interface ConnectorDialogDetailData extends ConnectorOptions {
  additionalId?: string;
  bizTypeId: string;
  paasApp: ConnectorDialogDetailPaasData;
  actionsValue: ConnectorOptionsAction[];
  insertRuleForms: ConnectorRuleFormItemType[];
  selectRuleForms: ConnectorRuleFormItemType[];
  showFieldNameList: string[];
  inputType: CardInputTypeEnum;
  appType?: AppTypeEnum | null;
  conditionalLimit: string;
  stateCanEdit?: string[];
}

interface ConnectorDialogDetailPaasData {
  id: string;
  name: string;
  icon: string;
  type: string;
}

interface ConnectorCardInfoConfig extends CardInfoConfig {

}

interface ConnectorField extends Field {

}

interface ConnectorModule {
  name: string;
  canSelect: boolean;
  children: ConnectorModuleForm[];
}

// interface ConnectorAppModule {
//   name: string;
//   canSelect?: boolean;
//   appType?: string;
//   appId?: string;
//   children: ConnectorAppModule[];
//   uniqueId?: string;
//   // 表单类型
//   bizType?: string | undefined;
//   // 表单id
//   bizTypeId?: string | undefined;

// }


interface ConnectorModuleForm {
  appType: string,
  // 表单名称
  name: string;
  // 表单logo
  logo: string;
  // 表单类型
  bizType: ConnectorBizTypeEnum;
  // 表单id
  bizTypeId: string;
  // 唯一的key, 前端用的。bizTypeId + name 拼接而成
  uniqueId: string;

  canSelect: boolean;
}

type ConnectorAppModuleListItem = Merge<ConnectorModuleForm, {
  bizType: string,
  // 是否能选中
  canSelect?: boolean;
  // 类型
  appType?: AppTypeEnum | null;
  children?: ConnectorAppModuleListItem[];
  icon?: string;
  appId?: string;
  id?: string;
}> 

// 连接器配置 执行动作
interface ConnectorOptionsAction {
  // 动作apiId
  apiId?: number | string;
  // 动作名称
  name: string;
  // 动作类型
  action: ConnectorOptionsActionEnum;
  // 是否选中
  selected: boolean;
  toRequestFieldList: ConnectorToField[];
  toResponseFieldList: ConnectorToField[];
}

// 连接器配置 操作符
interface ConnectorOptionsOperate {
  // 中文名
  cnName: string;
  // 英文名
  enName: string;
}

interface ConnectorFromField {
  // 中文名
  cnName: string;
  // 英文名
  enName: string;
  // 字段类型
  fieldType: string;
  // 是否显示
  show?: boolean;
  children?: ConnectorFromField[]
}

interface ConnectorToField {
  // 中文名
  cnName: string;
  // 英文名
  enName: string;
  // 字段类型
  fieldType: string;
  // 是否显示
  show: boolean;
  // 字段组，例如有 system 等	
  filedGroup: string;
  // 是否支持查询
  supportSelect: boolean;
  // 是否支持新增
  supportInsert: boolean;
  // 是否支持更新
  supportUpdate?: boolean;
  // 是否支持删除
  supportDelete?: boolean;
  // 对于新增来说，是否必填
  required: boolean;
  // 该字段支持的操作符列表
  operateList: ConnectorOptionsOperate[];
  // 配置
  setting: Record<string, any>;
  // 父字段
  parentEnName?: string;
  
  children?: ConnectorToField[]
}

interface ConnectorOptions {
  // 连接器配置 执行动作列表
  actionList: ConnectorOptionsAction[];
  // from 表单的字段列表
  fromFieldList: ConnectorFromField[];
  // to表单的字段列表
  toFieldList: ConnectorToField[];
  // 将toFieldList之前的接口拆成toRequestFieldList（查询条件）与toResponseFieldList（响应字段）
  toRequestFieldList: ConnectorToField[];
  toResponseFieldList :ConnectorToField[];

  insertFieldOptionsList?: ConnectorOptionsFieldOption[];
  selectFieldOptionsList?: ConnectorOptionsFieldOption[];
}

interface ConnectorEditOptions {
  additionalId: number;
  // from 表单业务类型
  fromBizType: ConnectorBizTypeEnum;
  // from 表单id
  fromBizTypeId: string;
  // to 表单业务类型
  toBizType: ConnectorBizTypeEnum;
  // to 表单id
  toBizTypeId: string;
  // to 表单logo
  toBizTypeLogo: string;
  // to 表单名称
  toBizTypeName: string;
  // 连接器配置 执行动作列表
  actionList: ConnectorOptionsAction[];
  // from 表单的字段列表
  fromFieldList: ConnectorFromField[];
  // to表单的字段列表
  toFieldList: ConnectorToField[];
  // 新建插入配置规则
  insertFieldOptionsList: ConnectorOptionsFieldOption[];
  // 查询配置规则
  selectFieldOptionsList: ConnectorOptionsFieldOption[];
  // 附加组件类型 单次 或 多次
  addTime: CardInputTypeEnum;
  // 表格显示的表单字段列表
  showFieldNameList: string[];
  appType?: AppTypeEnum | null;
  conditionalLimit: string;
}

interface ConnectorOptionsFieldOption {
  // 字段名
  toEnName: string;
  // 取值方式  1：固定值，2：对应字段
  valueType: ConnectorOptionsFieldOptionValueTypeEnum | null;
  // 操作符
  operate: string;
  // 如果取值方式为对应字段，则传：["$fromEnName$"]
  // 如果取值方式为固定值，操作符为 =，则传：["固定值"]
  // 如果取值方式为固定值，操作符为in，则传：["value1", "value2"]
  // 如果取值方式为固定值，操作符为between，则传：["start", "end"]，小的在前面，大的在后面
  // TODO: 类型
  value: any[];
}

interface ConnectorCardInfo extends CardInfo  {
  config: CardInfoConnectorConfig;
}

interface ConnectorCardAdditionInfoHeader {
  // 中文名
  cnName: string;
  // 英文名
  enName: string;
  // 字段类型
  fieldType: string;
}

interface ConnectorCardAdditionInfoButton {
  // 按钮名称
  buttonName: string;
  // 按钮功能
  function: ConnectorOptionsActionEnum;
  // 前端跳转路径
  jumpPath: string;
}

/** 
 * @description 触发器节点
*/
interface TriggerSettingNode {
  // 子节点
  childNodes: TriggerSettingNode[];
  // 当前节点数据
  data: TriggerSettingNodeData<TriggerSettingNodeTypeEnum>;
  // 获取父节点
  getParent: () => TriggerSettingNode;
  id: number;
  // 是否为开始节点
  isStart: boolean;
  // 节点名称
  nodeName: string;
  // 父节点id
  parentId: number;
  // 节点类型
  type: TriggerSettingNodeTypeEnum;
  // 节点唯一id
  uniqueId: string;
}

/** 
 * @description 触发器 发起应用 节点数据
*/
interface TriggerSettingStartApplicationNodeData {
  // 发起应用类型
  bizType: ConnectorBizTypeEnum;
  // 发起应用id
  bizTypeId: string;
  // 发起应用logo
  logo: string;
  // 发起应用名称
  name: string;
}

/** 
 * @description 触发器 触发动作 节点数据
*/
interface TriggerSettingTriggerActionNodeData {
  // 业务触发动作码
  bizActionCode: string;
  // 业务触发动作名称
  bizActionName: string;
}

/** 
 * @description 触发器 触发条件 节点数据
*/
interface TriggerSettingConditionNodeData {
  // 条件列表
  conditionList: ConnectorRuleFormItemType[][];
  // 触发条件规则名称
  name: string;
}

/** 
 * @description 触发器 执行应用 节点数据
*/
interface TriggerSettingExecuteApplicationNodeData {
  // 执行应用业务类型
  bizType: ConnectorBizTypeEnum;
  // 执行应用业务类型id
  bizTypeId: string;
  // 执行应用动作
  executeAction: {
    // 执行应用动作
    action?: string;
    // 执行应用 apiId
    apiId?: number | string;
    // 执行应用动作方法码
    executeMethod: number,
    // 执行应用动作 新建配置
    insertFieldOptions: ConnectorRuleFormItemType[],
    // 执行应用动作 删除配置
    deleteFieldOptions: ConnectorRuleFormItemType[],
    // 执行应用动作 更新配置
    updateFieldOptions: {
      // 执行应用动作 更新配置 查询条件
      select: ConnectorRuleFormItemType[],
      // 执行应用动作 更新配置 更新内容配置
      update: ConnectorRuleFormItemType[]
    }
  };
  // 执行应用logo
  logo: string;
  // 执行应用名称
  name: string;
}

/** 
 * @description 触发器 消息通知 节点数据
*/
interface TriggerSettingMessageNotificationNodeData {

}

interface TriggerSettingDefaultNodeData {}

type TriggerSettingNodeData<Type extends TriggerSettingNodeTypeEnum> = 
  Type extends TriggerSettingNodeTypeEnum.StartApplication 
    ? TriggerSettingStartApplicationNodeData 
    : Type extends TriggerSettingNodeTypeEnum.TriggerAction
      ? TriggerSettingTriggerActionNodeData
      : Type extends TriggerSettingNodeTypeEnum.Condition
        ? TriggerSettingConditionNodeData
        : Type extends TriggerSettingNodeTypeEnum.ExecuteApplication
          ? TriggerSettingExecuteApplicationNodeData
          : Type extends TriggerSettingNodeTypeEnum.MessageNotification
            ? TriggerSettingMessageNotificationNodeData
            : TriggerSettingDefaultNodeData;



interface ActionCreateParams {
  apiId: string,
  toBizTypeName: string,
  toRequestFieldList: ConnectorToField[],
  toResponseFieldList: ConnectorToField[],
  request: ConnectorRuleFormItemType[],
  relationAppForm: string[],
  response: Record<string, any>
}
export {
  ConnectorDialogDetailData,
  ConnectorDialogDetailPaasData,
  ConnectorCardInfo,
  ConnectorField,
  ConnectorCardInfoConfig,
  ConnectorModule,
  ConnectorToField,
  ConnectorFromField,
  ConnectorOptionsOperate,
  ConnectorOptionsAction,
  ConnectorModuleForm,
  ConnectorOptions,
  ConnectorOptionsFieldOption,
  ConnectorCardAdditionInfoHeader,
  ConnectorCardAdditionInfoButton,
  ConnectorEditOptions,
  TriggerSettingNode,
  TriggerSettingExecuteApplicationNodeData,
  TriggerSettingNodeData,
  TriggerSettingStartApplicationNodeData,
  TriggerSettingTriggerActionNodeData,
  TriggerSettingConditionNodeData,
  TriggerSettingMessageNotificationNodeData,
  TriggerSettingDefaultNodeData,
  // ConnectorAppModule,
  ConnectorAppModuleListItem,
  ActionCreateParams
}